package com.m1.tzolkin.model.util.board;

import java.io.Serializable;
import java.util.List;

import com.m1.tzolkin.model.exceptions.EndOfGameException;
import com.m1.tzolkin.model.exceptions.NoMovedWorkersException;
import com.m1.tzolkin.model.exceptions.WaitingOperationsException;
import com.m1.tzolkin.model.util.player.IPlayer;

/**
 * Un mod�le de plateau de jeu g�n�rique.
 * Dans n'importe quel jeu, un plateau de jeu poss�de un gestionnaire
 *  de joueurs, qui les fait tous jouer chacun leur tour.
 *  
 * @inv <pre>
 *     getPlayers() != null </pre>
 *     
 * @cons <pre>
 * $DESC$
 *     Un plateau avec les joueurs de players.
 * $ARGS$
 *     Collection<E> players
 * $PRE$
 *     players.size() >= 2
 * $POST$
 *     getPlayers().equals(players)
 *     getCurrentPlayer() == getFirstPlayer() == un joueur au hasard </pre>
 *
 */
public interface IBoard<E extends IPlayer> extends Serializable {
	
	// REQUETES
	
	/**
	 * Retourne le joueur en train de jouer.
	 */
	E getCurrentPlayer();
	
	/**
	 * Retourne le Premier joueur.
	 */
	E getFirstPlayer();
	
	/**
	 * Retourne l'ensemble des joueurs de ce plateau
	 *  dans l'ordre o� ils ont �t� donn�s.
	 */
	List<E> getPlayers();
	
	// COMMANDES
	
	/**
	 * Ach�ve le tour du joueur courant et passe au joueur suivant.
	 * Retourne le nouveau joueur courant.
	 */
	E endTurn() throws WaitingOperationsException, EndOfGameException, NoMovedWorkersException;

}
